package com.he.principles.LSP.before;

/**
 * @description: TODO
 * @Author: HCL
 * @Date: 2024/8/21 17:13
 */
public class RectangleClient {
    public static void main(String[] args) {
//        我们运行一下这段代码就会发现，假如我们把一个普通长方形作为参数传入resize方法，就会看到长方形宽度逐渐增长的效果，当宽度大于长度,代码就会停止，这种行为的结果符合我们的预期;
//        假如我们再把一个正方形作为参数传入resize方法后，就会看到正方形的宽度和长度都在不断增长，代码会一直运行下去，直至系统产生溢出错误。所以，普通的长方形是适合这段代码的，正方形不适合。
//        我们得出结论:在resize方法中，Rectang1e类型的参数是不能被square类型的参数所代替，如果进行了替换就得不到预期结果。因
//        此，square类和Rectang1e类之间的继承关系违反了里氏代换原则，它们之间的继承关系不成立，正方形不是长方形。
//        如何改进呢?此时我们需要重新设计他们之间的关系。抽象出来一个四边形接口(Quadrilatera1)，让Rectangle类和square类实现Quadrilateral接囗

        System.out.println("==============长方形");
        Rectangle rectangle = new Rectangle();
        rectangle.setLength(20d);
        rectangle.setWidth(10d);
        resize(rectangle);
        printLengthAndWidth(rectangle);

        System.out.println("==============正方形");
        Square square = new Square();
        square.setLength(20d);
        resize(square);
        printLengthAndWidth(square);
    }

    /**
     * @Description 扩宽方法
     * @Author HCL
     * @Date 2024/8/21 17:18
     * @Param []
     * @Return void
     */
    private static void resize(Rectangle rectangle) {
        while (rectangle.getWidth() <= rectangle.getLength()) {
            rectangle.setWidth(rectangle.getWidth() + 1);
        }
    }

    /**
    * @Description 打印长、宽
    * @Author HCL
    * @Date 2024/8/22 9:45
    * @Param []
    * @Return void
    */
    private static void printLengthAndWidth(Rectangle rectangle){
        System.out.println("length = " + rectangle.getLength());
        System.out.println("width = " + rectangle.getWidth());
    }
}
